import def from './def';
// import observe from './observe';

const arrayPrototype = Array.prototype;

export const arrayMethods = Object.create(arrayPrototype);

// 要重写的7个方法
const methodsNeedChange = [
    "push",
    "pop",
    "shift",
    "unshift",
    "splice",
    "sort",
    "reverse",
];

methodsNeedChange.forEach(methodName => {
    // 备份原有的方法
    const originMethod = arrayMethods[methodName];

    def(
        arrayMethods,
        methodName,
        function () {
            // 通过 argument 获取传入的参数值，其为一个类数组，故此处用 apply 来重写this
            const result = originMethod.apply(this, arguments);
            const ob = this.__ob__;
            const arg = [...arguments];
            let inserted = [];
            switch (methodName) {
                case 'push':
                case 'unshift':
                    inserted = arg;
                    break;
                case 'splice':
                    inserted = arg[2];
                    break;
            }
            // observe(inserted);
            // 劫持新增的数据项
            if (inserted.length) {
                // 由于此时新增的数据一定是数组，所以直接来调用数组响应化的方法
                ob.observeArray(inserted);
            }
            console.log('array');
            ob.dep.notify();
            return result;
        },
        false
    );
});